package reflection;

import javax.xml.catalog.Catalog;
import java.lang.reflect.Method;

/**
 * @author 王艺锡
 * @version 1.0
 */
public class Reflection01 {
    //反射优点:可以动态的创建和使用对象，(也是框架底层核心)，使用灵活
    //反射缺点:使用反射基本是解释执行，对执行速度有影响
    public static void main(String[] args) throws Exception {
        m1();
        m2();
        m3();
    }

public static void m1(){
        //使用常规方法调用hi方法所需时间
    long start = System.currentTimeMillis();
    Cat cat = new Cat();
    for (int i = 0;i<999999999;i++){
        cat.hi();
    }
    long end = System.currentTimeMillis();
    System.out.println("m1用时:" + (end - start));

}

    public static void m2() throws Exception {
        //使用反射调用hi方法所需时间
        Class<?> cls = Class.forName("reflection.Cat");
        Object o = cls.newInstance();
        Method hi = cls.getMethod("hi");
        long start = System.currentTimeMillis();
        for (int i = 0;i<999999999;i++){
        hi.invoke(o);
        }

        long end = System.currentTimeMillis();
        System.out.println("m1用时:" + (end - start));

    }


    public static void m3() throws Exception {
        //使用反射调用hi方法所需时间
        Class<?> cls = Class.forName("reflection.Cat");
        Object o = cls.newInstance();
        Method hi = cls.getMethod("hi");
        hi.setAccessible(true);//在反射调用此方法时，取消访问检查
        long start = System.currentTimeMillis();
        for (int i = 0;i<999999999;i++){
            hi.invoke(o);
        }

        long end = System.currentTimeMillis();
        System.out.println("m1用时:" + (end - start));

    }

}
